home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 June / PCpro_2006_06.ISO / files / freeware / openvip.exe / {app} / notify.py < prev    next >
Encoding:
Python Source  |  2003-06-03  |  1.8 KB  |  66 lines

  1. #
  2. # This file is part of OpenVIP (http://openvip.sourceforge.net)
  3. #
  4. # Copyright (C) 2002-2003
  5. # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
  6. #
  7. # This program is licensed under GNU General Public License version 2;
  8. # see file COPYING in the top level directory for details.
  9. #
  10. # $Id: notify.py,v 1.4 2003/06/03 21:01:13 vaclavslavik Exp $
  11. #
  12. # Notifications mechanism
  13. #
  14.  
  15. import weakref
  16.  
  17. # Notification events:
  18. CHANGED = 'changed'
  19. DELETED = 'deleted'
  20.  
  21.  
  22. # Map of notification callbacks:
  23. class NotificationEntry:
  24.     def __init__(self):
  25.         self.callbacks = {}
  26. __listener = {}
  27.  
  28. def __doNotify(entry, event):
  29.     if event in entry.callbacks:
  30.         for cb in entry.callbacks[event]:
  31.             cb()
  32.  
  33. def __onDelete(weak):
  34.     __doNotify(__listener[weak], DELETED)
  35.     del __listener[weak]
  36.  
  37. def __getEntry(object):
  38.     idx = weakref.ref(object)
  39.     if idx not in __listener:
  40.         idx = weakref.ref(object, __onDelete)
  41.         __listener[idx] = NotificationEntry()
  42.     return __listener[idx]
  43.  
  44.  
  45. # -------------------------------------------------------------
  46. # Public functions:
  47. # -------------------------------------------------------------
  48.  
  49. def listen(object, callback, event = CHANGED):
  50.     """Adds callback to the list of functions to call when given event
  51.        happens to object. The callback is called only when somebody
  52.        calls notify(object,event), not automatically!"""
  53.     c = __getEntry(object).callbacks
  54.     if event not in c:
  55.         c[event] = [callback]
  56.     else:
  57.         c[event].append(callback)
  58.  
  59. def unlisten(object, callback, event = CHANGED):
  60.     """Removes callback registered using listen()."""
  61.     __getEntry(object).callbacks[event].remove(callback)
  62.  
  63. def notify(object, event = CHANGED):
  64.     """Sends notification to all listeners registered with object."""
  65.     __doNotify(__getEntry(object), event)
  66.